package cn.com.liu.a_hellloworld;

import java.text.SimpleDateFormat;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class HelloWorld {

	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		Deployment deployment=processEngine.getRepositoryService()//与流程定义和部署相关的service
		.createDeployment()//创建一个部署对象
		.name("helloworld入门实例")
		.addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载，一次只能加载一个文件
		.addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载，一次只能加载一个文件
		.deploy();//完成部署
		
		System.out.println("部署ID："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**启动流程实例*/
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="helloworld";
		ProcessInstance pi=processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的service
		.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id的属性值，使用key值启动，默认是按照最新版本的流程定义启动
	System.out.println("流程实例ID："+pi.getId());
	System.out.println("流程定义ID："+pi.getProcessDefinitionId());
	}
	
	/**查询当前人的个人任务*/
	@Test
	public void findMyPersonTask(){
		String assignee="张三";
		List<Task> list=processEngine.getTaskService()//与正在执行的任务相关的service
		.createTaskQuery()//创建任务查询对象
		.taskAssignee(assignee)//指定个人任务查询，指定办理人
		.list();
		
		if(list!=null&&list.size()>0){
			for (Task task : list) {
				System.out.println("任务id："+task.getId());
				System.out.println("任务名称："+task.getName());
				System.out.println("任务创建时间："+task.getCreateTime());
				System.out.println("任务办理人："+task.getAssignee());
				System.out.println("流程实例ID："+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义id:"+task.getProcessDefinitionId());
				
				System.out.println("********************************************");
			}
		}
	}
	
	/**完成我的任务*/
	@Test
	public void completeMyPersonTask(){
		String taskId="4202";
		processEngine.getTaskService()//与正在执行的任务相关的service
		.complete(taskId);
		System.out.println("完成任务，任务ID："+taskId);
	}
	
	/**
	 * 查询流程状态（判断流程正在执行还是结束）
	 */
	@Test
	public void isProcessEnd(){
		String processInstanceId="1001";
	ProcessInstance pi=	processEngine.getRuntimeService().createProcessInstanceQuery()
		.processInstanceId(processInstanceId).singleResult();
	if(pi==null){
		System.out.println("流程结束");
	}else{
		System.out.println("流程正在执行中");
	}
	}
	
	/**
	 * 查询历史任务
	 */
	@Test
	public void findHistoryTask(){
		String taskAssignee="张三";
		List<HistoricTaskInstance> list=processEngine.getHistoryService().createHistoricTaskInstanceQuery()
		.taskAssignee(taskAssignee).list();
		if(list!=null&&list.size()>0){
			for (HistoricTaskInstance hi : list) {
				System.out.println("任务id："+hi.getId()+",任务名称："+hi.getName()+",任务办理人："+hi.getAssignee()+
	                               ",流程实例ID:"+hi.getProcessInstanceId()+","+ 
						"任务开始时间："+(hi.getStartTime()!=null?SimpleDateFormat.getDateTimeInstance().format(hi.getStartTime()):"")+
						",任务结束时间："+(hi.getEndTime()!=null?SimpleDateFormat.getDateTimeInstance().format(hi.getEndTime()):""));
			
			}
		}
	}
	
	/**
	 * 查询历史流程实例
	 */
	public void findHistoryProcessInstance(){
		
	}
	
	/**
	 * 删除正在执行的流程实例
	 */
	@Test
	public void deleteProcessInstance(){
		RuntimeService runtimeService = processEngine.getRuntimeService();
		List<ProcessInstance> piList = runtimeService.createProcessInstanceQuery().list();//查询所有正在执行的流程实例
		for (ProcessInstance pi : piList) {
			runtimeService.deleteProcessInstance(pi.getProcessInstanceId(), "删除正在执行的流程实例");
			System.out.println(pi.getProcessInstanceId());
		}
	}
}
